#include "Input.h";
#include "onafhankelijkeData.h";

//geeft de pointer naar de input terug
mailBox* GiveInput(sensor sens)
{
	return &sens.sensorInput;
}

//initialiseert de gegeven sensor
void sensorInit(sensor *sens)
{
	(*sens).taak = (task*)malloc(sizeof(task));
	create_mailBox((&(*sens).sensorInput), 1, sizeof(SensorInvoer));
	create_mailBox((&(*sens).sensorOutput), 1, sizeof(SensorUitvoer));
	create_event((&(*sens).dataOpInvoer), 0); 
	(*sens).gasOud = 0;
	(*sens).remOud = 0;
	(*sens).koppelingOud = 0;
}

//start de taak van een specifieke sensor
unsigned __stdcall inputStart(void* arg){
	task* t = (task*) arg; //haal de taak op
	SensorInvoer invoer; //variabele voor het uitlezen van de invoer
	SensorUitvoer uitvoer;
	sensor *sens = (sensor *)getArgument_task(t); //haal de parameter op
	while(!isTerminated_task(t)){ //zolang de taak loopt moet het volgende worden gedaan
		
		get_mailBox(&((*sens).sensorInput), &invoer); //de plaats waar de data moet komen
		
		uitvoer.snelheid = invoer.snelheid;//geef de snelheid door aan de output van de sensor

		if(((*sens).gasOud-invoer.gas) < 0 ||((*sens).remOud-invoer.rem) < 0 || ((*sens).koppelingOud-invoer.koppeling) < 0)
		{
			uitvoer.actie = PedaalIndrukken;
		}
		/*er hoeft niet altijd een knop ingedrukt te worden.
		  in sommige gevallen zal er geen knop worden ingedrukt
		  maar zal er wel een wijziging in de snelheid zijn
		  dit resulteert erin dat invoer.knop == NULL en dat het
		  systeem een controle op de snelheid moet uitvoeren
		*/
		if(invoer.knoppen != NULL)
		{
			//voor iedere knop die wordt ingedrukt moet een ander signaal
			//worden gegeven aan sout.Actie
			switch(invoer.knoppen)
			{
			case (AanuitKnop):
				uitvoer.actie = activatieknopIndrukken;
				break;
			case(VersnellenKnop):
				uitvoer.actie = Snelheidverhogen;
				break;
			case(VertragenKnop):
				uitvoer.actie = Snelheidverlagen;
				break;
			case(PauzeKnop):
				uitvoer.actie = Pauzeren;
				break;
			}
		} else {
			uitvoer.actie = SnelheidControleren;
		}
		(*sens).uitdata.actie = uitvoer.actie;
		(*sens).uitdata.snelheid = uitvoer.snelheid;
		put_mailBox(&((*sens).sensorOutput), &(*sens).uitdata);
		pulse_event((&(*sens).dataOpInvoer));	//het event dat er actuele data op de output staat wordt gegeven
	}
	return 0;
}

//ruimt een sensor op
void sensorDelete(sensor *sens)
{
	delete_task((*sens).taak);	//stopt de taak en verwijdert deze
	delete_mailBox(&((*sens).sensorInput));
	delete_mailBox(&((*sens).sensorOutput));
	delete_event(&((*sens).dataOpInvoer)); //verwijdert het event
}